// pages/cart/index.js
/*
1、获取用户收货地址
    1、绑定点击事件
    2、调用小程序内置api 获取用户的收获地址 wx.chooseAddress
    2、获取用户对小程序所授予的获取地址的权限 scope
        1、假设用户点击获取收货地址的提示框确定 scope值为true 此时可以直接调用获取收货地址 authSetting scope.address
        2、假设用户点击获取收货地址的提示框取消 scope值为false
            1、诱导用户自己打开授权设置页面 当用户重新给予收货地址权限的时候
            2、获取收货地址
        3、假设用户重来没有调用过收货地址，scope为undefined，此时可以直接获取收货地址
        4、把获取到的地址存入到本地存储中
    2、页面加载完毕
        0、onLoad onshow
        1、获取本地存储中的地址数据
        2、把数据设置给data中的一个变量
    3、onshow
        0、回到商品详情页面，第一次添加商品的时候，手动添加了商品属性
            1、num=1
            2、checked=true
        1、 获取缓存中的购物车数组
        2、把购物车数据填充到data中
    4、全选的实现，数据展示
        1、onshow获取缓存中的购物车数组
        2、根据购物车中的商品数量计算，所有被选中，全选被选中
    5、总价格与总数量计算
        1、都需要商品被选中，才拿他计算
        2、获取购物车的数组
        3、遍历
        4、判断是否被选中
        5、总价格 += 商品单价*商品数量
        6、总数量 += 商品的数量
        7、把计算后的价格和数量设置回data中
    6、商品的选中
        1、绑定change事件
        2、获取被修改的商品对象
        3、商品对象的选中状态，取反
        4、重新填充中data中和缓存中
        5、重新计算全选，总价格，总数量
    7、全选和反选
        1、全选复选框绑定事件change
        2、获取data中的全选变量 allChecked
        3、直接取反allChecked=!allChecked
        4、遍历购物车数组，让里面 购物车商品选择状态跟着allChecked改变而改变
        5、把购物车数组和allChecked重新设置回data中，把购物车数组重新设置回缓存中
    8、商品数量的编辑
        1、+"和""-"按钮绑定同一个点击事件，区分的关键在于自定义属性
            1 “+”  “+1”
            2 “-”  “-1”
        2、传递被点击的商品id goods_id
        3、获取data中的购物车数组， 来获取需要修改的商品对象
        4、直接修改商品对象的数量 num
            当购物车数量=1且继续点击“-”，弹窗提示showModel，询问用户是否要删除
            1、确定删除则移除
            2、取消则无变化

        5、把cart数组重新设置会缓存中和data中this.setCart
    9、点击结算
        1、判断有没有收货地址信息
        2、判断有没有选购商品
        3、经过验证跳到支付界面
*/
import {getSetting,chooseAddress,openSetting,showModal,showToast} from "../../utils/asyncWx.js";
import regeneratorRuntime from '../../lib/runtime/runtime';
Page({
    data:{
        address:{},
        cart:[],
        allChecked:false,
        totalPrice:0,
        totalNum:0
    },
    onShow(){
        //1、获取缓存中的收货地址信息
        const address=wx.getStorageSync("address");
        //onshow 1 获取缓存中的购物车数据
        const cart=wx.getStorageSync("cart")||[];
        this.setData({address});
        this.setCart(cart);

    },
    //点击收货地址
    async handleChooseAddress(){
        try {
            // 1 获取 权限状态
            const res1 = await getSetting();
            const scopeAddress = res1.authSetting["scope.address"];
            // 2 判断 权限状态
            if (scopeAddress === false) {
                await openSetting();
            }
            //3、调用获取收货地址的api
            const address = await chooseAddress();
            // 5 存入到缓存中
            wx.setStorageSync("address", address);
        } catch (error) {
            console.log(error);
        }
    },
    //商品的选中
    handleItemChange(e){
        //获取被修改的商品的id
        const goods_id=e.currentTarget.dataset.id;
        //2、获取购物车数组
        let {cart}=this.data;
        //找到被修改的商品对象
        let index=cart.findIndex(v=>v.goods_id===goods_id);
        //4、选中状态取反
        cart[index].checked=!cart[index].checked;
        this.setCart(cart);
        console.log(goods_id);
        
    },
    // 设置购物车状态同事，重新计算底部工具栏的数据，全选，总价格，购买数量
    setCart(cart){
        let allChecked=true;
        //总价格和总数量
        let totalPrice=0;
        let totalNum=0;
        cart.forEach(v=>{
            if(v.checked){
                totalPrice +=v.num*v.goods_price;
                totalNum += v.num
            }else{
                allChecked = false
            }
        })
        //判断数组是否为空
        allChecked = cart.length!=0?allChecked:false;
        this.setData({
            cart,
            totalNum,
            totalPrice,
            allChecked
        });
        //5,6把购物车数据重新设置会data和缓存中
        wx.setStorageSync("cart", cart);
    },
    //商品全选行为
    handleItemAllCheck(){
        //获取data中的数据
        let {cart,allChecked} = this.data
        //2、修改值
        allChecked=!allChecked
        //循环修改cart数组中的商品选中状态
        cart.forEach(v=>v.checked=allChecked);
        //4 修改后的值，填充回data或者缓存中
        this.setCart(cart);
    },
    //商品数量编辑功能
    async handleItemNumEdit(e){
        //1、接收传递过来的参数
        const{operation,id} = e.currentTarget.dataset;
        console.log(operation,id);
        //获取购物车数组
        let {cart} = this.data;
        //找到需要修改的商品的索引
        const index=cart.findIndex(v=>v.goods_id===id);
        //判断是否执行删除
        if(cart[index].num===1 && operation===-1){
            const res = await showModal({content:"您是否需要删除？"});
            if(res.confirm){
                cart.splice(index,1);
                this.setCart(cart);
            }
        }else{
                //进行修改数量
                cart[index].num+=operation;
                //5、设置会缓存和data中
                this.setCart(cart);
            }
    },
    //商品结算
    async handlePay(){
        //1、判断收货地址
        const {address,totalNum} = this.data;
        if(!address.userName){
            await showToast({title:"您还没有选择收货地址"});
            return;
        }
        //2、判断用户有没有选购商品
        if(totalNum===0){
            await showToast({title:"您还没有选购商品"});
            return;
        }
        //跳转到支付页面
        wx.navigateTo({
            url:'/pages/pay/index'
        });
    }
})